﻿//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading;
//using System.Threading.Tasks;

//namespace homework3
//{

//    public class Node<T>
//    {
//        public Node<T> Next { get; set; }
//        public T Data { get; set; }
//        public Node(T t)
//        {
//            Next = null;
//            Data = t;
//        }
//    }
//    public class GenericList<T>:IEnumerable<T>
//    {
//        private Node<T> tail;
//        public GenericList()
//        {
//            tail = null; head = null;
//        }
//        public Node<T> head { get; set; }
//        public void Add(T t)
//        {
//            Node<T> n = new Node<T>(t);
//            if (tail != null)
//            {
//                tail.Next = n;
//                tail = n;
//            }
//            else
//            {
//                head = tail = n;
//            }
//        }

//        public IEnumerator GetEnumerator()
//        {
//            throw new NotImplementedException();
//        }

//        IEnumerator<T> IEnumerable<T>.GetEnumerator()
//        {
//            throw new NotImplementedException();
//        }

//    }


//    public delegate void alarmHandler(object sender, EventArgs e);
//    public delegate void tickHandler(object sender, EventArgs e);
//    public class clock
//    {
//        public event tickHandler tick;
//        public event alarmHandler alarm;

//        public void to_tick()
//        {
//            Console.WriteLine("time to tick");
//            EventArgs e = new EventArgs();
//            tick(this, e);
//        }
//        public void to_alarm()
//        {
//            Console.WriteLine("time to alarm");
//            EventArgs e = new EventArgs();
//            alarm(this, e);
//        }
//    }
//    internal class Program
//    {
//        public static void time1(object sender, EventArgs e)
//        {
//            Console.WriteLine("tick");
//        }
//        public static void time2(object sender, EventArgs e)
//        {
//            Console.WriteLine("alarm!");
//        }
//        public static void FOREACH<T>(GenericList<T> g, Action<T> action)
//        {
//            Node<T> k = g.head;
//            while (k != null)
//            {
//                action(k.Data);
//                k = k.Next;
//            }
//        }
//        static void Main(string[] args)
//        {

//            //整型List
//            GenericList<int> intlist = new GenericList<int>();
//            for (int x = 0; x < 10; x++)
//            {
//                intlist.Add(x);
//            }
//            for (Node<int> node = intlist.head;
//            node != null; node = node.Next)
//            {
//                Console.WriteLine(node.Data);
//            }
//            //字符串型list
//            GenericList<string> strlist = new GenericList<string>();
//            for (int x = 0; x < 10; x++)
//            {
//                strlist.Add("str" + x);
//            }
//            for (Node<string> node = strlist.head;
//            node != null; node = node.Next)
//            {
//                Console.WriteLine(node.Data);
//            }
//            FOREACH<int>(intlist, x => Console.WriteLine(x));
//            FOREACH<string>(strlist, x => Console.WriteLine(x));
//            int sum = 0, max = int.MinValue, min = int.MaxValue;
//            FOREACH<int>(intlist, x => sum += x);
//            FOREACH<int>(intlist, x => { if (x > max) max = x; });
//            FOREACH<int>(intlist, x => { if (x < min) min = x; });
//            Console.WriteLine(sum);
//            Console.WriteLine(max);
//            Console.WriteLine(min);


//            //时钟
//            clock m_c = new clock();
//            m_c.tick += time1;
//            m_c.alarm += time2;
//            int i = 5;
//            while (i > 0)
//            {
//                m_c.to_tick();
//                Thread.Sleep(1000);
//                i--;
//            }
//            m_c.to_alarm();
//            Console.ReadLine();
//        }

//    }
//}